英雄登场

目标

01. 设计 英雄子弹

英雄需求

  1. 游戏启动后,英雄 出现在屏幕的 水平中间 位置,距离 屏幕底部 120 像素
  2. 英雄 每隔 0.5 秒发射一次子弹,每次 连发三枚子弹
  3. 英雄 默认不会移动,需要通过 左/右 方向键,控制 英雄 在水平方向移动

017_英雄位置-w480

子弹需求

  1. 子弹英雄 的正上方发射 沿直线上方 飞行
  2. 飞出屏幕后,需要从 精灵组 中删除

016_派生英雄和子弹子类

Hero —— 英雄

Bullet —— 子弹

02. 创建英雄

2.1 准备英雄类

003_pygame.Rect-w382

017_英雄位置-w480

 

2.2 绘制英雄

  1. __create_sprites,添加 英雄精灵英雄精灵组

    • 后续要针对 英雄碰撞检测 以及 发射子弹
    • 所以 英雄 需要 单独定义成属性
  2. __update_sprites,让 英雄精灵组 调用 updatedraw 方法

代码实现

 
 

03. 移动英雄位置

pygame 中针对 键盘按键的捕获,有 两种 方式

提问 这两种方式之间有什么区别呢?

 
 

结论

3.1 移动英雄位置

演练步骤

  1. Hero 类中重写 update 方法

    • 速度 speed英雄 rect.x 进行叠加
    • 不需要调用父类方法 —— 父类方法只是实现了单纯的垂直运动
  2. __event_handler 方法中根据 左右方向键 设置英雄的 速度

    • 向右 => speed = 2
    • 向左 => speed = -2
    • 其他 => speed = 0

代码演练

 
 

3.2 控制英雄运动边界

003_pygame.Rect-w382

017_英雄位置II-w408

 

04. 发射子弹

需求回顾 —— 英雄需求

  1. 游戏启动后,英雄 出现在屏幕的 水平中间 位置,距离 屏幕底部 120 像素
  2. 英雄 每隔 0.5 秒发射一次子弹,每次 连发三枚子弹
  3. 英雄 默认不会移动,需要通过 左/右 方向键,控制 英雄 在水平方向移动

4.1 添加发射子弹事件

pygame定时器 使用套路非常固定:

  1. 定义 定时器常量 —— eventid
  2. 初始化方法 中,调用 set_timer 方法 设置定时器事件
  3. 游戏循环 中,监听定时器事件

代码实现

 
 
 
 

4.2 定义子弹类

需求回顾 —— 子弹需求

  1. 子弹英雄 的正上方发射 沿直线上方 飞行
  2. 飞出屏幕后,需要从 精灵组 中删除

Bullet —— 子弹

定义子弹类

 

4.3 发射子弹

演练步骤

  1. Hero初始化方法 中创建 子弹精灵组 属性

  2. 修改 plane_main.py__update_sprites 方法,让 子弹精灵组 调用 updatedraw 方法

  3. 实现 fire() 方法

    • 创建子弹精灵
    • 设置初始位置 —— 在 英雄的正上方
    • 子弹 添加到精灵组

代码实现

 
 

一次发射三枚子弹

017_英雄位置III-w559